/**
 * Copyright (c) 2019, Freqchip
 * 
 * All rights reserved.
 * 
 * 
 */

/*
 * INCLUDES
 */
 
#ifndef _USER_TASK_H
#define _USER_TASK_H

#include "stdint.h"
#include "stdbool.h"


enum user_event_t {
    USER_EVT_AT_COMMAND,
    USER_EVT_BUTTON,
    USER_EVT_KEY_SEND,  // 新增按键发送事件
};

enum user_audio_event_t {
    USER_EVT_MIC,			//Mic
    DECODER_EVENT_PREPARE,
    DECODER_EVENT_NEXT_FRAME,
    DECODER_EVENT_STOP,
    DECODER_EVENT_WAIT_END_TO,
};


#define UP_KEY       (GPIO_PD5)
#define DOWN_KEY     (GPIO_PD6)
#define LEFT_KEY     (GPIO_PD4)
#define RIGHT_KEY    (GPIO_PD7)

#define OK_KEY       (GPIO_PB7)
#define PICTURE_KEY  (GPIO_PB5)




/**
 * @brief 数字化仪报告点结构体
 */
typedef struct {
    uint16_t x;          // X坐标
    uint16_t y;          // Y坐标
    uint8_t tip_switch;  // 笔尖状态 (0:释放, 1:按下)
    uint8_t in_range;    // 在位状态 (0:离开, 1:在位)
    uint8_t barrel_switch; // 侧键状态 (0:未按下, 1:按下)
    uint8_t eraser;      // 橡皮擦状态 (0:笔尖, 1:橡皮擦)


	// uint8_t contact_id;
	// uint8_t contact_count;
} digitizer_point_t;






/**
 * @brief 坐标偏移offset结构体
 */
typedef struct {

	bool report_mode;
	uint8_t dev_name[48];    // 设备名称，最大47个字符 + 1个结束符
    int16_t x_offset;          // X坐标
    int16_t y_offset;          // Y坐标
	int16_t picture_x_offset;   // 照相X坐标偏移
	int16_t picture_y_offset;   // 照相Y坐标
    
} offset_point_t;



typedef enum{

		REMOTE_MODE = 0,
		MUSIC_MODE  = 1,
}FUNC_MODE;


typedef enum{

    NONE_SETTING_MODE      = 0,
	SCROLL_POS_SETTING_MODE      = 1,
	SCROLL_POS_PICTURE_SETTING_MODE  = 2,
}FUNC_POS_SET;





typedef struct {


	uint8_t /*FUNC_MODE*/ mode;
	uint8_t/*FUNC_POS_SET*/ pos_set_mode;

}func_setting_t;

typedef struct 
{
	/* data */
	offset_point_t offset_point_config[8];
	int DEVICE_NUM;
	func_setting_t mode;
}devices_config_t;



extern uint16_t user_task_id;
extern uint16_t audio_task_id;
extern uint16_t key_send_task_id;  // 新增按键发送任务ID

extern uint16_t delay_connect_send;
void user_task_init(void);

// 设备配置管理接口函数
void devices_config_init(void);
bool devices_config_save_device_name(const uint8_t *device_name, uint16_t name_len);
bool devices_config_find_device(const uint8_t *device_name, uint16_t name_len);
bool devices_config_update_device_name(const uint8_t *old_name, uint16_t old_name_len, 
                                      const uint8_t *new_name, uint16_t new_name_len);
bool devices_config_get_current_device_name(uint8_t *device_name, uint16_t *name_len);
void devices_config_save_to_flash(void);
void devices_config_load_from_flash(void);
uint8_t devices_config_get_device_count(void);

/**
 * @brief 根据设备名称查找设备索引
 * @param device_name 设备名称
 * @param name_len 设备名称长度
 * @return 设备索引，如果未找到返回0xFF
 */
uint8_t devices_config_find_device_index(const uint8_t *device_name, uint16_t name_len);

/**
 * @brief 设置当前连接的设备名称
 * @param device_name 设备名称
 * @param name_len 设备名称长度
 */
void devices_config_set_current_device_name(const uint8_t *device_name, uint16_t name_len);

/**
 * @brief 获取当前连接的设备名称
 * @param device_name 输出参数：设备名称缓冲区
 * @param name_len 输出参数：设备名称长度
 * @return true: 获取成功, false: 获取失败
 */
bool devices_config_get_current_device_name(uint8_t *device_name, uint16_t *name_len);

#endif  // _USER_TASK_H

